home *** CD-ROM | disk | FTP | other *** search
/ 5 Star Games: DOS Edition 2 / 5 Star Games - DOS Edition (1995)(Ready to Run).iso / dbc / dbupd.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-05-01  |  13.0 KB  |  506 lines

  1. #ifdef __TURBOC__
  2.   #include <conio.h>
  3. #else
  4.   #include <graph.h>
  5. #endif
  6. #include <dos.h>
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include "db_types.h"
  10. #include "db_lsc.h"
  11. #include "db_conio.h"
  12. #include "db_curs.h"
  13. #include "db_date.h"
  14. #include "db_dos.h"
  15. #include "db_file.h"
  16. #include "db_funcs.h"
  17. #include "db_gvar.h"
  18. #include "db_heap.h"
  19. #include "db_key.h"
  20. #include "db_man.h"
  21. #include "db_sets.h"
  22. #include "db_str.h"
  23. #include "db_tree.h"
  24. #include "db_win.h"
  25. #include "db_mnu.h"
  26. #include "db_util.h"
  27.  
  28. unsigned _stklen = 0x4000;   /* Default stack of 16 K */
  29.  
  30. #define TempFName    "_UPDTEMP.DAT"
  31. #define UpdExt       ".UPD"
  32. #define MemoRecStat  -2
  33.  
  34. typedef uchar genbuf[DB_mxdrs];
  35. typedef enum {_Byte,_StrPtr} Varieties;
  36.  
  37. typedef struct {
  38.   byte     v;  /* type changed from Varieties so storage is PASCAL compatible */
  39.   byte     b;
  40.   strptr   s;
  41. } multityp;
  42.  
  43. typedef struct {
  44.   uchar    typ;
  45.   byte     len;
  46.   byte     dec;
  47.   strptr   strp;
  48. } fielddescr;
  49.  
  50. typedef fielddescr manyfields[DB_mxdrs];
  51. typedef manyfields *fldsptr;
  52. typedef multityp   updtabtyp[DB_mxdrs];
  53. typedef updtabtyp  *updtabptr;
  54.  
  55.  
  56. bool       quit;
  57. uchar      ctlkey;
  58. mnufrec    dm;
  59. int        oldsz,newsz;
  60. int        numold,numnew;
  61. pathstr    infoname,ufname1,ufname2;
  62. fldsptr    oldflds,newflds;
  63. updtabptr  updtab;
  64. datafile   odatf,ndatf;
  65. genbuf     trec1,trec2;
  66. genbuf     oldrec,updrec;
  67. long       *oldrecstat = (long *) oldrec;
  68. long       *updrecstat = (long *) updrec;
  69.  
  70. void clearbuf(genbuf buf, int numf, fldsptr flds)
  71. {
  72.   int i;
  73.   word fofs;
  74.   string ts;
  75.  
  76.   memset(buf,' ',DB_mxdrs);
  77.   for (i=0; i<4; i++) buf[i] = 0;
  78.   fofs = 4;
  79.   for (i=0; i<numf; i++) {
  80.     switch ((*flds)[i].typ) {
  81.       case _Ch :
  82.         buf[fofs + (*flds)[i].len] = Nul;
  83.       break;
  84.       case _Num :
  85.         fstr(ts,0.0,(*flds)[i].len,(*flds)[i].dec);
  86.         memmove(&buf[fofs],ts,(*flds)[i].len+1);
  87.       break;
  88.       case _Memo : memset(&buf[fofs],0,4); break;
  89.     }
  90.     fofs += (*flds)[i].len;
  91.     if ((*flds)[i].typ != _Memo) fofs++;
  92.   }
  93. }
  94.  
  95. strptr getsptr(int ind, fldsptr flds, ptr buf)
  96. {
  97.   int i;
  98.   word fofs;
  99.  
  100.   fofs = 4;
  101.   for (i=0; i<ind; i++) {
  102.     fofs += (*flds)[i].len;
  103.     if ((*flds)[i].typ != _Memo)
  104.       fofs++;
  105.   }
  106.   return(MK_FP(FP_SEG(buf),FP_OFF(buf)+fofs));
  107. }
  108.  
  109. bool chkexists(strptr instr)
  110. {
  111.   string ts;
  112.  
  113.   if (!exists(instr) || (exitcode == F2)) {
  114.     if ((strchr(instr,'*') != NULL) || (strchr(instr,'?') != NULL))
  115.       dirpick(instr,strip(ts,instr),DirIncl,DirExcl | A_RDONLY,0,0);
  116.     else
  117.       dirpick(instr,"*.DAT",DirIncl,DirExcl | A_RDONLY,0,0);
  118.     exitcode = ' ';
  119.   }
  120.   return((bool)(exists(instr) || empty(instr)));
  121. }
  122.  
  123. bool chknew(strptr instr)
  124. {
  125.   uchar ans[2],no[2],tpic[2];
  126.  
  127.   chstr(ans,_YES);
  128.   chstr(no,_NO);
  129.   chstr(tpic,Pic_U);
  130.   if (exists(instr)) dbgetstr(ans,_Ch,LSC_OverwriteExisting,no,tpic,"",chkyesno,nohelp);
  131.   return((bool)(ans[0] == _YES));
  132. }
  133.  
  134. bool selectnames(void)
  135. {
  136.   int doublepos;
  137.   string ts;
  138.   uchar tpic[4];
  139.  
  140.   if (strchr(ufname1,'\\') == NULL) strconcat(ufname1,datapath,"\\",ufname1,NULL);
  141.   doublepos = strposstr("\\\\",ufname1);
  142.   if (doublepos >= 0) strdelete(ufname1,doublepos,1);
  143.   strcpy(tpic,"64");
  144.   strchcat(tpic,Pic_U);
  145.   dbgetstr(ts,_Ch,LSC_UpdateIn,ufname1,tpic,"",chkexists,nohelp);
  146.   strip(ufname1,ts);
  147.   if (exitcode != QitKey) {
  148.     strcpy(ufname2,ufname1);
  149.     dbgetstr(ts,_Ch,LSC_CreatingUpdFile,ufname2,tpic,"",chknew,nohelp);
  150.     strip(ufname2,ts);
  151.   }
  152.   return((bool)(exitcode != QitKey));
  153. }
  154.  
  155.  
  156. bool loadinfo(void)
  157. {
  158.   bool fval;
  159.   byte b;
  160.   int i;
  161.   FILE *infofile;
  162.  
  163.   infofile = fopen(infoname,"rb");
  164.   if (infofile != NULL) {
  165.     fread(&b,1,1,infofile);
  166.     ufname1[b] = '\0';
  167.     fread(ufname1,1,b,infofile);
  168.     fread(&oldsz,sizeof(oldsz),1,infofile);
  169.     fread(&numold,sizeof(numold),1,infofile);
  170.     oldflds = db_malloc(numold*sizeof(fielddescr));
  171.     fread(oldflds,sizeof(fielddescr),numold,infofile);
  172.     for (i=0; i<numold; i++) (*oldflds)[i].strp = getsptr(i,oldflds,oldrec);
  173.     fread(&b,1,1,infofile);
  174.     ufname2[b] = '\0';
  175.     fread(ufname2,1,b,infofile);
  176.     fread(&newsz,sizeof(newsz),1,infofile);
  177.     fread(&numnew,sizeof(numnew),1,infofile);
  178.     newflds = db_malloc(numnew*sizeof(fielddescr));
  179.     fread(newflds,sizeof(fielddescr),numnew,infofile);
  180.     for (i=0; i<numnew; i++) (*newflds)[i].strp = getsptr(i,newflds,updrec);
  181.     updtab = db_malloc(numnew*sizeof(multityp));
  182.     for (i=0; i<numnew; i++) {
  183.       fread(&((*updtab)[i].v),sizeof((*updtab)[i].v),1,infofile);
  184.       switch ((Varieties) (*updtab)[i].v) {
  185.         case _Byte :
  186.           fread(&((*updtab)[i].b),1,1,infofile);
  187.           if ((*updtab)[i].b > 0)
  188.             (*updtab)[i].s = (*oldflds)[(*updtab)[i].b-1].strp;
  189.           else
  190.             (*updtab)[i].s = NULL;
  191.         break;
  192.         case _StrPtr :
  193.           fread(&b,1,1,infofile);
  194.           (*updtab)[i].s = db_malloc(b+1);
  195.           (*updtab)[i].s[b] = '\0';
  196.           fread((*updtab)[i].s,1,b,infofile);
  197.           (*updtab)[i].b = 0;
  198.         break;
  199.       }
  200.     }
  201.     fclose(infofile);
  202.     fval = selectnames();
  203.   }
  204.   else fval = False;
  205.   return(fval);
  206. }
  207.  
  208. void newmemos(ptr oldm, ptr newm)
  209. {
  210.   long *oldmemoref,*newmemoref;
  211.   long tl,tr1,tr2,totb,savm;
  212.   long *memostat,*memolink;
  213.  
  214.   oldmemoref = (long *) oldm;
  215.   newmemoref = (long *) newm;
  216.   totb = 0L;
  217.   savm = *oldmemoref;
  218.   *newmemoref = 0L;
  219.   if (savm > 0L) {
  220.     while (savm != 0L) {
  221.       getrec(&odatf,savm,&trec1[(int) totb]);
  222.       memmove(&savm,&trec1[(int) (totb+oldsz-4)],4);
  223.       memmove(&trec1[(int) totb],&trec1[(int) (totb+4)],oldsz-8);
  224.       totb += oldsz-8;
  225.     }
  226.     tl = 0L;
  227.     memostat = (long *) trec2;
  228.     memolink = (long *) &trec2[newsz-4];
  229.     addrec(&ndatf,&tr1,trec2);
  230.     *newmemoref = tr1;
  231.     while (totb > 0L) {
  232.       memset(trec2,' ',newsz);
  233.       *memostat = MemoRecStat;
  234.       if (totb >= (newsz-8))
  235.         memmove(&trec2[4],&trec1[(int) tl],newsz-8);
  236.       else
  237.         memmove(&trec2[4],&trec1[(int) tl],(int) (totb+1));
  238.       totb -= newsz-8;
  239.       tl += newsz-8;
  240.       if (totb > 0) {
  241.         addrec(&ndatf,&tr2,trec2);
  242.         *memolink = tr2;
  243.       }
  244.       else *memolink = 0L;
  245.       putrec(&ndatf,tr1,trec2);
  246.       tr1 = tr2;
  247.     }
  248.   }
  249. }
  250.  
  251. void updaterec(long _auto)
  252. {
  253.   int i;
  254.   string ts, cmp;
  255.  
  256.   for (i=0; i<numnew; i++) if ((*updtab)[i].s != NULL) {
  257.     if ((*newflds)[i].typ != _Memo) {
  258.       strcpy(ts,(*updtab)[i].s);
  259.       upper(cmp,ts);
  260.       if (strcmp(cmp,"SYSDATE") == 0) sysdate(ts);
  261.       else if (strcmp(cmp,"AUTO") == 0) strip(ts,istr(ts,_auto,10));
  262.       switch ((*newflds)[i].typ) {
  263.         case _Ch  :
  264.           strcopy(ts,ts,0,(*newflds)[i].len);
  265.           pad((*newflds)[i].strp,ts,(*newflds)[i].len,Right);
  266.         break;
  267.         case _Num :
  268.           fstr((*newflds)[i].strp,valu(ts),(*newflds)[i].len,(*newflds)[i].dec);
  269.         break;
  270.       }
  271.     }
  272.     else newmemos((*updtab)[i].s,(*newflds)[i].strp);
  273.   }
  274. }
  275.  
  276. void updatedata(void)
  277. {
  278.   long li,_auto,trec,recs;
  279.   winptr twinp;
  280.   string ts;
  281.  
  282.   if (openwin(0,1,1,scrwid,scrhgt,swc,sbc,0,"─┐│┘─└│┌",TopCnt,"")) {
  283.     twinp = curwin;
  284.     hidewin(T_ON,twinp);
  285.   }
  286.   else twinp = NULL;
  287.   openfile(&odatf,ufname1,oldsz);
  288.   if (ok) {
  289.     makefile(&ndatf,TempFName,newsz);
  290.     if (ok) {
  291.       writewxy(centre(ts,LSC_UpdatingData,80),0,1,1,twinp);
  292.       writewxy(centre(ts,ufname1,80),0,1,2,twinp);
  293.       writewxy(centre(ts,LSC_ToFile,80),0,1,3,twinp);
  294.       writewxy(centre(ts,ufname2,80),0,1,4,twinp);
  295.       strconcat(ts,LSC_Recs2Process,istr(ts,usedrecs(&odatf),10),NULL);
  296.       writewxy(ts,0,10,6,twinp);
  297.       writewxy(LSC_RecsProcessed,0,10,7,twinp);
  298.       _auto = 0L;
  299.       clearbuf(updrec,numnew,newflds);
  300.       recs = filelen(&odatf)-1;
  301.       for (li=1L; li<=recs; li++) {
  302.         writewxy(istr(ts,li,10),0,31,7,twinp);
  303.         getrec(&odatf,li,oldrec);
  304.         if (*oldrecstat == 0L) {
  305.           updaterec(++_auto);
  306.           addrec(&ndatf,&trec,updrec);
  307.         }
  308.       }
  309.       closefile(&odatf);
  310.       closefile(&ndatf);
  311.       if (exists(ufname2))
  312.         unlink(ufname2);
  313.       rename(TempFName,ufname2);
  314.       writewxy(centre(ts,LSC_PressAnyKey,80),0,1,scrhgt,twinp);
  315.       getkey();
  316.     }
  317.     else {
  318.       closefile(&odatf);
  319.       dspmsge("",LSC_BadTempFile,0.0);
  320.     }
  321.   }
  322.   else
  323.     dspmsge("",LSC_BadOrigFile,0.0);
  324.   if (twinp != NULL)
  325.     closewin(&twinp);
  326. }
  327.  
  328. void do_proc(int procno, mnufrec *m)
  329. {
  330.   string ts,spec;
  331.  
  332.   switch (procno) {
  333.     case 1 :
  334.       strcat(chstr(spec,'*'),UpdExt);
  335.       dirpick(ts,spec,DirIncl,DirExcl | A_RDONLY,0,0);
  336.       strip(infoname,ts);
  337.     break;
  338.     case 2 :
  339.       if (infoname[0] != '\0') {
  340.         if (loadinfo()) updatedata();
  341.       }
  342.       else
  343.         dberrm(LSC_SelectUPDFirst);
  344.     break;
  345.     case 3 :
  346.       quit = True;
  347.     break;
  348.   }
  349. }
  350.  
  351. void do_ctl(mnufrec *m, itmptr itm)
  352. {
  353.   if ((m->curmnu != NULL) && (itm != NULL)) {
  354.     switch (itm->seltyp) {
  355.       case _Jump :
  356.         jumptomnu(m,(byte)ival(itm->selact));
  357.       break;
  358.       case _Menu :
  359.         if ((ival(itm->selact) > 0) &&
  360.            (m->mat[(int) ival(itm->selact)-1] != NULL)) {
  361.           if (m->mat[(int) ival(itm->selact)-1]->winp != NULL)
  362.             jumptomnu(m,(byte)ival(itm->selact));
  363.           else {
  364.             m->mat[(int) ival(itm->selact)-1]->pmnu = m->curmnu->mno;
  365.             m->curmnu = m->mat[(int) ival(itm->selact)-1];
  366.             dspmnu(m,m->curmnu);
  367.             m->curitm = m->curmnu->litm;
  368.             m->level = 0;
  369.           }
  370.         }
  371.       break;
  372.       case _Proc :
  373.         do_proc((int) ival(itm->selact),m);
  374.       break;
  375.       case _Quit :
  376.         quit = True;
  377.       break;
  378.     }
  379.   }
  380. }
  381.  
  382. void loadmanual(void)
  383. {
  384.   string tfnam;
  385.   fspec fr;
  386.  
  387.   fsplit(strip(tfnam,dm.mnufnam),fr.fdir,fr.fname,fr.fext);
  388.   strconcat(fr.fpath,fr.fdir,DatabossManual,NULL);
  389.   if (!exists(fr.fpath)) strconcat(fr.fpath,fr.fdir,fr.fname,".MAN",NULL);
  390.   initmanual(fr.fpath);
  391. }
  392.  
  393. bool initdbm(void)
  394. {
  395.   strcpy(dm.mnufnam,"DBUPD.DMU");
  396.   initmnu(&dm,0,0,OnDisk);
  397.   return((bool)(dm.curmnu != NULL));
  398. }
  399.  
  400. void main(void)
  401. {
  402.   string ts;
  403.   uchar yes[2],tpic[2];
  404.  
  405.   db_curs_init();
  406.   db_date_init();
  407.   db_funcs_init();
  408.   db_gvar_init();
  409.   db_heap_init();
  410.   db_key_init();
  411.   db_man_init();
  412.   db_tree_init();
  413.   db_win_init();
  414.   db_mnu_init();
  415.   db_util_init();
  416.  
  417.   chstr(yes,_YES);
  418.   chstr(tpic,Pic_U);
  419.   initedit();
  420.   initindex();
  421.   set_addmember(ExitSet,AltX);
  422.   if (initdbm()) {
  423.     loadmanual();
  424.     clrscr();
  425.     dispallwin();
  426.     quit = False;
  427.     dspmnu(&dm,dm.curmnu);
  428.     infoname[0] = '\0';
  429.     do {
  430.       hbar(&dm);
  431.       ctlkey = upperch(getkey());
  432.       if ((ctlkey == DArr) && (!mousekey) &&
  433.          ((dm.curmnu->mtyp != Vert) && (dm.curitm->seltyp == _Menu)))
  434.         ctlkey = Enter;
  435.       if (set_member(dm.mnualtset,ctlkey))
  436.         processalt(ctlkey,&dm,do_ctl);
  437.       else {
  438.         switch (ctlkey) {
  439.           case QitKey :
  440.             if (backjump > 0) {
  441.               jumptomnu(&dm,backjump);
  442.               backjump = 0;
  443.             }
  444.             else {
  445.               if ((dm.curmnu != NULL) && (dm.curmnu->pmnu != 0)) {
  446.                 zapmnu(&dm,dm.curmnu);
  447.                 dm.curmnu->litm = dm.curitm;
  448.                 dm.curmnu = dm.mat[dm.curmnu->pmnu-1];
  449.                 dm.curitm = dm.curmnu->litm;
  450.                 dm.level = 0;
  451.                 if (dm.curmnu->winp == NULL)
  452.                   dspmnu(&dm,dm.curmnu);
  453.               }
  454.               else
  455.                 quit = True;
  456.             }
  457.             break;
  458.           case UArr : goud(&dm,Up);    break;
  459.           case DArr : goud(&dm,Down);  break;
  460.           case LArr : gorl(&dm,Left);  break;
  461.           case RArr : gorl(&dm,Right); break;
  462.           case Enter:
  463.             if (gvar->sec >= dm.curitm->sec) {
  464.               if ((backjump > 0) && (dm.curitm->seltyp != _Proc))
  465.                 backjump = 0;
  466.               do_ctl(&dm,dm.curitm);
  467.               if (backjump > 0) {
  468.                 jumptomnu(&dm,backjump);
  469.                 backjump = 0;
  470.               }
  471.             }
  472.           break;
  473.           case HlpKey : itemhelp(&dm); break;
  474.           case Home   : firstitm(&dm); break;
  475.           case EndKey : lastitm(&dm);  break;
  476.           case AltV   : setdeltas();  break;
  477.           case AltX   : quit = True;  break;
  478.           default :
  479.             if (selitm(ctlkey,&dm)) {
  480.               hbar(&dm);
  481.               if ((backjump > 0) && (dm.curitm->seltyp != _Proc))
  482.                 backjump = 0;
  483.               do_ctl(&dm,dm.curitm);
  484.               if (backjump > 0) {
  485.                 jumptomnu(&dm,backjump);
  486.                 backjump = 0;
  487.               }
  488.             }
  489.           break;
  490.         }
  491.       }
  492.       if (quit) {
  493.         dbgetstr(ts,_Ch,LSC_QuitProgram,yes,tpic,"",chkyesno,nohelp);
  494.         quit = (bool)((ts[0] == _YES) && (exitcode != QitKey));
  495.       }
  496.     } while (!quit);
  497.     disposemnus(&dm);
  498.   }
  499.   else {
  500.     writewxy(centre(ts,LSC_BadMenu,80),15,1,25,NULL);
  501.     delayorkey(2.0);
  502.   }
  503.   clrscr();
  504.   gotoxy(1,25);
  505. }
  506.